以下是我簡單的跟SQL Table所做的比對:
Many2one(多對一):
Many2one筆者認為其實就是單純的使用了foreign key,最大的原因就是因為當你在使用Many2one時,
你會設定一個欄位與另一個Table做關聯,也就是外鍵關聯(foreign key relationship),如 Day11 的例子:
class BookName(models.Model):
_name = 'book.name'
_description = "book's name model"
name = fields.Char(string='Name', required=True)
book_id = fields.Many2one('category', string='Category', required=True)
也就是說book_id與model category關聯而book_id會與category的Primary key做對應。
Many2many(多對多):
Many2many就會是使用我們所設定的兩個Table中,Foreign Key來做為一個Table,也就是所謂的多重外鍵關係(composite foreign key relationship),如 Day12 :
class BookName(models.Model):
_name = 'book.name'
_description = "book's name model"
name = fields.Char(string='Name', required=True)
author = fields.Many2many('author', 'author_book_name_tag',
'book_name', 'author_name',string='Author')
在這當中兩個Foreign key分別是book_name跟author_name,彼此之間對應,對方多的欄位。
One2many(一對多):
而在odoo中,One2many是使用反向的Many2one來作呈現,所以其本質就是外鍵關聯(foreign key relationship),但特別要注意的是,使用上你必須要先有Many2one,然後你在設定One2many時,你也必須宣告一個名稱,如 Day13 :
class BookName(models.Model):
_name = 'book.name'
_description = "book's name model"
name = fields.Char(string='Name', required=True)
book_id = fields.Many2one('category', string='Category', required=True)
class Category(models.Model):
_name = 'category'
_description = "category's model"
name = fields.Char(string='Name', required=True)
category_id = fields.One2many('book.name', 'book_id', string='Book's Name ID')
另外補充odoo提供了一組可用於與相關記錄進行交互的API:
Many2one API:
設定(Set)值: 將many2one字段的值設定為其他記錄。
record.many2one_field = other_record # 將many2one字段設定為other_record
獲取(Get)值: 獲取many2one字段的值。
related_record = record.many2one_field # 獲取many2one字段的值
Many2many API:
設定(Set)值: 將many2many字段的值設定為包含一個或多個記錄的列表。
record.many2many_field = [(4, id1), (4, id2), ...] # 添加記錄到many2many字段
添加(Add)值: 將一個或多個記錄添加到many2many字段。
record.many2many_field = [(4, id1), (4, id2)] # 添加記錄到many2many字段
刪除(Remove)值: 從many2many字段中刪除一個或多個記錄。
record.one2many_field = [(0, 0, {'field1': value1, 'field2': value2}), ...]
# 設定one2many字段的值
One2many API:
設定(Set)值: 將one2many字段的值設定為包含一個或多個字典的列表。
record.one2many_field = [(0, 0, {'field1': value1, 'field2': value2}), ...]
# 設定one2many字段的值
添加(Add)值: 添加一個新記錄到one2many字段。
record.one2many_field = [(4, 0, 0)] # 添加新記錄到one2many字段
刪除(Remove)值: 從one2many字段中刪除一個或多個記錄。
record.one2many_field = [(2, id)] # 從one2many字段中刪除記錄